package com.campus.food.service;

import com.campus.food.model.entity.Food;

import java.util.List;

/**
 * 菜品服务接口
 * 
 * @author Claude3.7 Sonnet
 * @since 2025-05-29
 */
public interface FoodService {
    
    /**
     * 添加菜品
     * @param food 菜品信息
     * @return 添加成功的菜品
     */
    Food addFood(Food food);
    
    /**
     * 根据ID查询菜品
     * @param id 菜品ID
     * @return 菜品信息
     */
    Food getFoodById(Long id);
    
    /**
     * 更新菜品信息
     * @param food 菜品信息
     * @return 更新结果
     */
    boolean updateFood(Food food);
    
    /**
     * 更新菜品状态
     * @param id 菜品ID
     * @param status 状态（0-下架，1-上架）
     * @param merchantId 商家ID（用于权限验证）
     * @return 更新结果
     */
    boolean updateFoodStatus(Long id, Integer status, Long merchantId);
    
    /**
     * 删除菜品
     * @param id 菜品ID
     * @param merchantId 商家ID（用于权限验证）
     * @return 删除结果
     */
    boolean deleteFood(Long id, Long merchantId);
    
    /**
     * 根据商家ID查询菜品列表
     * @param merchantId 商家ID
     * @param status 状态（可选）
     * @return 菜品列表
     */
    List<Food> getFoodsByMerchantId(Long merchantId, Integer status);
    
    /**
     * 分页查询菜品列表（商家端）
     * @param merchantId 商家ID
     * @param page 页码
     * @param size 每页大小
     * @param name 菜品名称（可选）
     * @param category 分类（可选）
     * @param status 状态（可选）
     * @return 菜品列表
     */
    List<Food> getFoodListByMerchant(Long merchantId, int page, int size, String name, String category, Integer status);
    
    /**
     * 查询菜品总数（商家端）
     * @param merchantId 商家ID
     * @param name 菜品名称（可选）
     * @param category 分类（可选）
     * @param status 状态（可选）
     * @return 菜品总数
     */
    long getFoodCountByMerchant(Long merchantId, String name, String category, Integer status);
    
    /**
     * 分页查询菜品列表（用户端）
     * @param merchantId 商家ID
     * @param page 页码
     * @param size 每页大小
     * @param name 菜品名称（可选）
     * @param category 分类（可选）
     * @return 菜品列表
     */
    List<Food> getFoodListForUser(Long merchantId, int page, int size, String name, String category);
    
    /**
     * 查询菜品总数（用户端）
     * @param merchantId 商家ID
     * @param name 菜品名称（可选）
     * @param category 分类（可选）
     * @return 菜品总数
     */
    long getFoodCountForUser(Long merchantId, String name, String category);
    
    /**
     * 根据分类查询菜品列表
     * @param merchantId 商家ID
     * @param category 分类
     * @return 菜品列表
     */
    List<Food> getFoodsByCategory(Long merchantId, String category);
    
    /**
     * 查询商家的菜品分类列表
     * @param merchantId 商家ID
     * @return 分类列表
     */
    List<String> getFoodCategories(Long merchantId);
    
    /**
     * 查询热销菜品
     * @param merchantId 商家ID
     * @param limit 数量限制
     * @return 热销菜品列表
     */
    List<Food> getHotFoods(Long merchantId, Integer limit);
    
    /**
     * 批量查询菜品
     * @param ids 菜品ID列表
     * @return 菜品列表
     */
    List<Food> getFoodsByIds(List<Long> ids);
    
    /**
     * 增加菜品销量
     * @param id 菜品ID
     * @param quantity 数量
     * @return 更新结果
     */
    boolean increaseSales(Long id, Integer quantity);
    
    /**
     * 批量删除菜品
     * @param ids 菜品ID列表
     * @param merchantId 商家ID（用于权限验证）
     * @return 删除结果
     */
    boolean deleteFoodBatch(List<Long> ids, Long merchantId);
    
    /**
     * 搜索菜品
     * @param keyword 搜索关键词
     * @param page 页码
     * @param size 每页大小
     * @param merchantId 商家ID（可选）
     * @param category 分类（可选）
     * @param minPrice 最低价格（可选）
     * @param maxPrice 最高价格（可选）
     * @return 菜品列表
     */
    List<Food> searchFoods(String keyword, int page, int size, Long merchantId, String category, Double minPrice, Double maxPrice);
    
    /**
     * 获取推荐菜品
     * @param merchantId 商家ID（可选）
     * @param limit 数量限制
     * @return 推荐菜品列表
     */
    List<Food> getRecommendedFoods(Long merchantId, int limit);
    
    /**
     * 批量更新菜品状态
     * @param ids 菜品ID列表
     * @param status 状态
     * @param merchantId 商家ID（用于权限验证）
     * @return 更新结果
     */
    boolean updateFoodStatusBatch(List<Long> ids, Integer status, Long merchantId);
    
    /**
     * 获取菜品销量统计
     * @param merchantId 商家ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 菜品销量统计列表
     */
    List<Food> getFoodSalesStats(Long merchantId, String startDate, String endDate);
    
    /**
     * 获取所有菜品列表（管理员专用）
     * @param page 页码
     * @param size 每页大小
     * @param merchantId 商家ID（可选）
     * @param category 分类（可选）
     * @param status 状态（可选）
     * @return 菜品列表
     */
    List<Food> getAllFoods(int page, int size, Long merchantId, String category, Integer status);
} 